"""
condition通常用于用生产者和消费者模型，目的为了解决生产者消费者的速度匹配问题。
"""
import threading
import random
import logging

logging.basicConfig(level=logging.INFO)


class Dispatcher:
    def __init__(self):
        self.data = 0
        self.cond = threading.Condition()  # 默认是Rlock
        self.event = threading.Event()

    # 生产者
    def produce(self):
        for i in range(100):
            data = random.randint(1, 100)
            with self.cond:
                self.data = data
                self.cond.notify_all()  # 全局通知
            self.event.wait(1)

    # 消费者
    def custom(self):
        while True:
            with self.cond:
                self.cond.wait()  # 永久等待
                logging.info(self.data)
            self.event.wait(0.05)  # 这句可以去掉


d = Dispatcher()

# 生产和消费各一个线程跑
p = threading.Thread(target=d.produce)
c = threading.Thread(target=d.custom)


"""
使用condition锁后，强制消费者去有顺序的读取生产者数据。这时生产者仍然1s生产一个，但是只有生产者生产一个，消费者才能拿一个；生产者还在生产，消费者就只能等着，相当于消费者被迫匹配生产者。因此不会出现重复数据。
"""
c.start()
p.start()
